<html>
    <head>
        <title>Hangfire后台作业管理器</title>
    </head>
    <body>
        <script>
            // Hangfire 后台作业管理器

                    /*
                        Hangfire是一个高级的后台作业管理器。

                        你可以将Hangfire与ABP集成使用它，而不是默认的后台作业管理器。

                        这样，你可以为Hangfire使用相同的后台作业API，你的代码将独立于Hangfire。

                        如果你愿意，你也可以直接使用Hangfire的API。
                    */

                    /*
                        一、安装
                                建议使用ABP CLI安装此软件包。

                                1、使用ABP CLI
                                           在项目文件夹（. csproj文件）中打开命令行窗口并键入以下命令：

                                                abp add-package Volo.Abp.BackgroundJobs.HangFire

                                2、手动安装：

                                       ①、将Volo. Abp.Back推断作业.HangFireNuGet包添加到你的项目中：
                                          
                                                Install-Package Volo.Abp.BackgroundJobs.HangFire
                                        
                                       ②、将AbpBackgroundJobsHangfireModule添加到模块的依赖列表中：

                                                [DependsOn(
                                                    //...other dependencies
                                                    typeof(AbpBackgroundJobsHangfireModule) //Add the new module dependency
                                                    )]
                                                public class YourModule : AbpModule
                                                {
                                                }
                    */  
                   
                    

                    /*
                        二、配置 

                                你可以为Hangfire安装任何存储。最常见的是SQL服务器（请参阅Hangfire. SqlServerNuGet包）。

                                安装这些NuGet包后，你需要将项目配置为使用Hangfire。

                                    1、1.首先，我们更改Module类（例如：<YourProjectName>HttpApiHostModule）以在ConfigureServices方法中添加存储和连接字符串的Hangfire配置：
                                                
                                                public override void ConfigureServices(ServiceConfigurationContext context)
                                                {
                                                    var configuration = context.Services.GetConfiguration();
                                                    var hostingEnvironment = context.Services.GetHostingEnvironment();

                                                    //... 其他配置


                                                    // 配置Hangfire
                                                    ConfigureHangfire(context, configuration);
                                                }

                                                private void ConfigureHangfire(ServiceConfigurationContext context, IConfiguration configuration)
                                                {
                                                    context.Services.AddHangfire(config =>
                                                    {
                                                        // 配置Hangfire存储
                                                        config.UseSqlServerStorage(configuration.GetConnectionString("Default"));
                                                    });
                                                }

                                        你必须为Hangfire配置存储


                                    2、如果要使用Hangfire的仪表板，可以在Module类的OnApplicationInitialization方法中添加UseAbpHangfireDashboard调用：
                                                
                                                public override void OnApplicationInitialization(ApplicationInitializationContext context)
                                                {
                                                    var app = context.GetApplicationBuilder();
                                                            
                                                    // ... others
                                                    
                                                    app.UseAbpHangfireDashboard(); // 使用Hangfire的仪表板中间件
                                                    app.UseConfiguredEndpoints();
                                                }

                                    3、指定队列
                                            你可以使用QueueAttribute来指定队列：
                                                using System.Threading.Tasks;
                                                using Volo.Abp.BackgroundJobs;
                                                using Volo.Abp.DependencyInjection;
                                                using Volo.Abp.Emailing;

                                                namespace MyProject
                                                {
                                                    [Queue("alpha")]  // 指定队列
                                                    public class EmailSendingJob
                                                        : AsyncBackgroundJob<EmailSendingArgs>, ITransientDependency
                                                    {
                                                        private readonly IEmailSender _emailSender;

                                                        public EmailSendingJob(IEmailSender emailSender)
                                                        {
                                                            _emailSender = emailSender;
                                                        }

                                                        // 执行邮件发送后台作业
                                                        public override async Task ExecuteAsync(EmailSendingArgs args)
                                                        {
                                                            await _emailSender.SendAsync(
                                                                args.EmailAddress,
                                                                args.Subject,
                                                                args.Body
                                                            );
                                                        }
                                                    }
                                                }


                                    4、仪表板授权  Dashboard Authorization
                                            
                    */
        </script>
    </body>
</html>